package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICompanyAdditionalFieldsDAO;
import org.jsola.hr.dto.CompanyAdditionalFieldsAddDTO;
import org.jsola.hr.dto.CompanyAdditionalFieldsUpdateDTO;
import org.jsola.hr.entity.CompanyAdditionalFieldsDO;
import org.jsola.hr.query.CompanyAdditionalFieldsQuery;
import org.jsola.hr.query.CompanyNecessaryFieldQuery;
import org.jsola.hr.vo.CompanyAdditionalFieldsListVO;
import org.jsola.hr.vo.CompanyAdditionalFieldsVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 公司员工额外字段表
 *
 * @author zhr
 */
public interface ICompanyAdditionalFieldsService extends IService<ICompanyAdditionalFieldsDAO, CompanyAdditionalFieldsDO> {

    /**
     * 月工资表表头查询
     *
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return Integer
     */
    Integer querySalaryHead(String companyId, TokenUser tokenUser);

    /**
     * 更改公司表头字段
     *
     * @param companyAdditionalFieldsQuery 公司员工额外字段表查询参数
     * @param tokenUser                    当前用户
     * @return Integer
     */
    Integer updateHead(CompanyAdditionalFieldsQuery companyAdditionalFieldsQuery, TokenUser tokenUser);

    /**
     * 查询公司表头字段
     *
     * @param companyAdditionalFieldsQuery 公司员工额外字段表查询参数
     * @param tokenUser                    当前用户
     * @return vo
     */
    CompanyAdditionalFieldsListVO getHead(CompanyAdditionalFieldsQuery companyAdditionalFieldsQuery, TokenUser tokenUser);

    /**
     * 新增公司员工额外字段表
     *
     * @param companyAdditionalFieldsAddDTO 新增公司员工额外字段表DTO
     * @param tokenUser                     当前用户
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsVO save(CompanyAdditionalFieldsAddDTO companyAdditionalFieldsAddDTO, TokenUser tokenUser);

    /**
     * 批量新增公司员工额外字段表
     *
     * @param companyAdditionalFieldsAddDTOList 新增公司员工额外字段表DTO
     * @param tokenUser                         当前用户
     * @return 公司员工额外字段表详情信息
     */
    List<CompanyAdditionalFieldsVO> batchSave(List<CompanyAdditionalFieldsAddDTO> companyAdditionalFieldsAddDTOList, TokenUser tokenUser);

    /**
     * 新增公司员工额外字段表
     *
     * @param companyAdditionalFieldsAddDTO 新增公司员工额外字段表DTO
     * @param tokenUser                     当前用户
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsVO save2(CompanyAdditionalFieldsAddDTO companyAdditionalFieldsAddDTO, TokenUser tokenUser);

    /**

    /**
     * 自定义模板新增自定义字段
     *
     * @param companyAdditionalFieldsAddDTO 新增公司员工额外字段表DTO
     * @param tokenUser                     当前用户
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsVO saveForCustom(CompanyAdditionalFieldsAddDTO companyAdditionalFieldsAddDTO, TokenUser tokenUser);

    /**
     * 自定义模板新增自定义字段 不校验自定义字段
     *
     * @param companyAdditionalFieldsAddDTO 新增公司员工额外字段表DTO
     * @param tokenUser                     当前用户
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsVO saveForCustom2(CompanyAdditionalFieldsAddDTO companyAdditionalFieldsAddDTO, TokenUser tokenUser);

    /**
     * 开启自定义模板，复制自定义字段（save方法）
     *
     * @param companyAdditionalFieldsAddDTO 新增公司员工额外字段表DTO
     * @param tokenUser                     当前用户
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsVO copyForCustom(CompanyAdditionalFieldsAddDTO companyAdditionalFieldsAddDTO, TokenUser tokenUser);

    /**
     * 开启自定义模板，批量复制自定义字段（save方法）
     *
     * @param companyAdditionalFieldsDOS 新增公司员工额外字段表DTO列表
     * @param tokenUser                  当前用户
     * @return 公司员工额外字段表详情信息
     */
    List<CompanyAdditionalFieldsVO> listCopyForCustom(List<CompanyAdditionalFieldsDO> companyAdditionalFieldsDOS, TokenUser tokenUser);

    /**
     * 修改公司员工额外字段表
     *
     * @param companyAdditionalFieldsUpdateDTO 修改公司员工额外字段表DTO
     * @param tokenUser                        当前用户
     * @return 更新数量
     */
    int update(CompanyAdditionalFieldsUpdateDTO companyAdditionalFieldsUpdateDTO, TokenUser tokenUser);

    /**
     * 修改公司员工额外字段表 若字段被模板使用 第一次报错 第二次直接修改
     *
     * @param companyAdditionalFieldsUpdateDTO 修改公司员工额外字段表DTO
     * @param tokenUser                        当前用户
     * @return 更新数量
     */
    int update2(CompanyAdditionalFieldsUpdateDTO companyAdditionalFieldsUpdateDTO, TokenUser tokenUser);

    /**
     * 开启/关闭自定义字段
     *
     * @param companyAdditionalFieldsId 字段Id
     * @param isOpen                    是否开启
     * @param tokenUser                 登录用户
     * @return 开启关闭自定义字段
     */
    int openField(Long companyAdditionalFieldsId, Boolean isOpen, TokenUser tokenUser);

    /**
     * 自定义字段修改必填
     *
     * @param companyAdditionalFieldsId 字段Id
     * @param isNecessary               是否是必填项
     * @param tokenUser                 登录用户
     * @return 开启关闭自定义字段
     */
    int necessaryField(Long companyAdditionalFieldsId, Boolean isNecessary, TokenUser tokenUser);

    /**
     * 修改自定义模板自定义字段
     *
     * @param companyAdditionalFieldsUpdateDTO 修改公司员工额外字段表DTO
     * @param tokenUser                        当前用户
     * @return 更新数量
     */
    int updateForCustom(CompanyAdditionalFieldsUpdateDTO companyAdditionalFieldsUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除公司员工额外字段表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser                  当前用户
     * @param companyAdditionalFieldsIds 公司员工额外字段表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... companyAdditionalFieldsIds);

    /**
     * 根据模板id删除
     *
     * @param templateIdList 自定义模板id
     * @param tokenUser      当前用户
     * @return 删除数量
     */
    int deleteByTemplateIdList(List<String> templateIdList, TokenUser tokenUser);

    /**
     * pc端删除额外字段
     *
     * @param tokenUser                 当前用户
     * @param companyAdditionalFieldsId 公司员工额外字段表id
     * @return 删除数量
     */
    int deleteForPc(TokenUser tokenUser, Long companyAdditionalFieldsId);

    /**
     * pc端删除额外字段 若字段被模板使用 第一次报错 第二次直接删除
     *
     * @param tokenUser                 当前用户
     * @param companyAdditionalFieldsId 公司员工额外字段表id
     * @return 删除数量
     */
    int deleteForPc2(TokenUser tokenUser, Long companyAdditionalFieldsId);

    /**
     * 根据公司员工额外字段表id查找
     *
     * @param companyAdditionalFieldsId 公司员工额外字段表id
     * @param siteId                    所属站点id
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsVO selectById(Long companyAdditionalFieldsId, String siteId);

    /**
     * 根据公司员工额外字段表id查找（不用siteId）
     *
     * @param companyAdditionalFieldsId 公司员工额外字段表id
     * @return 公司员工额外字段表详情信息
     */
    CompanyAdditionalFieldsDO selectByIdNoSite(Long companyAdditionalFieldsId);


    /**
     * 查询当前模块下当前字段名称
     *
     * @param module    模块
     * @param filedName 字段名称
     * @param companyId 公司id
     * @return 存在的列表
     */
    List<CompanyAdditionalFieldsDO> selectByModuleAndFiledName(String module, String filedName, String companyId);

    /**
     * 查询租户中当前模块下当前字段名称
     *
     * @param module    模块
     * @param filedName 字段名称
     * @param siteId    租户Id
     * @return 存在的列表
     */
    List<CompanyAdditionalFieldsDO> selectByModuleAndFiledNameInSite(String module, String filedName, String siteId);

    /**
     * 查询当前模块（入职/待入职/预登记）下当前字段名称
     *
     * @param moduleType 模块类型
     * @param filedName  字段名称
     * @param companyId  公司id
     * @return 存在的列表
     */
    List<CompanyAdditionalFieldsDO> selectByModuleTypeAndFiledName(String moduleType, String filedName, String companyId);

    /**
     * 查询公司员工额外字段表
     *
     * @param companyAdditionalFieldsQuery 查询条件
     * @param siteId                       所属站点id
     * @return 公司员工额外字段表列表信息
     */
    List<CompanyAdditionalFieldsListVO> select(CompanyAdditionalFieldsQuery companyAdditionalFieldsQuery, String siteId);

    /**
     * 查询公司员工额外字段表记录数
     *
     * @param companyAdditionalFieldsQuery 查询条件
     * @param siteId                       所属站点id
     * @return 公司员工额外字段表记录数
     */
    int selectCount(CompanyAdditionalFieldsQuery companyAdditionalFieldsQuery, String siteId);

    /**
     * 分页查询公司员工额外字段表
     *
     * @param companyAdditionalFieldsQuery 查询条件
     * @param siteId                       所属站点id
     * @return 公司员工额外字段表列表信息
     */
    Page<CompanyAdditionalFieldsListVO> selectPage(CompanyAdditionalFieldsQuery companyAdditionalFieldsQuery, String siteId);


    /**
     * 根据公司员工额外字段表id查找
     *
     * @param companyAdditionalFieldsId 公司员工额外字段表id
     * @param siteId                    所属站点id
     * @return 公司员工额外字段表
     */
    CompanyAdditionalFieldsDO selectDOById(Long companyAdditionalFieldsId, String siteId);


    /**
     * 根据公司员工额外字段表id查找
     *
     * @param companyAdditionalFieldsIdList 公司员工额外字段表id
     * @param tokenUser                     当前用户
     * @return 公司员工额外字段表
     */
    List<CompanyAdditionalFieldsDO> selectByIdList(List<Long> companyAdditionalFieldsIdList, TokenUser tokenUser);

    /**
     * 根据公司员工额外字段表id查找
     *
     * @param companyAdditionalFieldsIds 公司员工额外字段表id
     * @param siteId                     所属站点id
     * @return 公司员工额外字段表
     */
    List<CompanyAdditionalFieldsDO> selectDOByIds(List<Long> companyAdditionalFieldsIds, String siteId);

    /**
     * 查询公司员工额外字段表
     *
     * @param companyAdditionalFieldsQuery 查询条件
     * @param siteId                       所属站点id
     * @return 公司员工额外字段表列表
     */
    List<CompanyAdditionalFieldsDO> selectDO(CompanyAdditionalFieldsQuery companyAdditionalFieldsQuery, String siteId);

    /**
     * 查询公司下员工额外字段（templateId=null）
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return list
     */
    List<CompanyAdditionalFieldsListVO> selectByCompanyId(String companyId, String siteId);

    /**
     * 查询公司下员工额外字段（templateId=null） 租户级companyId为site 自定义字段为所有用工单位自定义并集
     *
     * @param companyId 用工单位Id，租户级为site
     * @param fieldName 字段名称，模糊查询
     * @param siteId    站点id
     * @return list
     */
    List<CompanyAdditionalFieldsListVO> selectByCompanyId2(String companyId, String fieldName, String siteId);

    /**
     * 根据用工单位查询
     *
     * @param companyIdList 用工单位
     * @param fieldName     fieldName
     * @param siteId        站点
     * @return 字段
     */
    List<CompanyAdditionalFieldsDO> getByCompanyId(List<String> companyIdList, String fieldName, String siteId);

    /**
     * 查询公司下员工额外字段（templateId=null） 租户级companyId为site 自定义字段为所有用工单位自定义并集 租户级查询包括入职、预登记、待入职的自定义字段
     *
     * @param companyId 用工单位Id，租户级为site
     * @param fieldName 字段名称，模糊查询
     * @param siteId    站点id
     * @return list
     */
    List<CompanyAdditionalFieldsListVO> selectByCompanyId3(String companyId, String fieldName, String siteId);

    /**
     * 查询公司下员工额外字段（templateId=null） 租户级companyId为site 自定义字段为用工单位抽取
     *
     * @param companyId 用工单位Id，租户级为site
     * @param fieldName 字段名称，模糊查询
     * @param siteId    站点id
     * @return list
     */
    List<CompanyAdditionalFieldsListVO> selectByCompanyId4(String companyId, String fieldName, String siteId);

    /**
     * 查询公司下员工额外字段（templateId=null）
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return list
     */
    List<CompanyAdditionalFieldsListVO> selectOpenByCompanyId(String companyId, String siteId);

    /**
     * 查询公司下员工额外字段
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return list
     */
    List<CompanyAdditionalFieldsDO> selectOpenDoByCompanyId(String companyId, String siteId);

    /**
     * 查询公司某个模块的所有自定义字段
     *
     * @param companyId  公司id
     * @param moduleCode 模块
     * @param siteId     站点id
     * @return list
     */
    List<CompanyAdditionalFieldsVO> selectByCompanyAndModuleCode(String companyId, String moduleCode, String siteId);

    /**
     * 查询公司某个模块的所有自定义字段
     *
     * @param companyId   公司id
     * @param moduleCodes 模块
     * @param siteId      站点id
     * @return list
     */
    List<CompanyAdditionalFieldsDO> selectByCompanyAndModuleCodes(String companyId, List<String> moduleCodes, String siteId);

    /**
     * 查询额外字段
     *
     * @param moduleType 模块类型
     * @param companyId  用工单位id；租户：site
     * @param templateId 模板id(为null跳过此字段检索)
     * @param tokenUser  当前用户
     * @return 额外字段
     */
    List<CompanyAdditionalFieldsListVO> listByCompanyId(String moduleType, String companyId, String templateId, TokenUser tokenUser);

    /**
     * 根据模板id查询额外字段
     *
     * @param templateId 模板id
     * @param tokenUser  当前用户
     * @return 额外字段
     */
    List<CompanyAdditionalFieldsDO> listByTemplateId(String templateId, TokenUser tokenUser);

    /**
     * 根据模板id查询额外字段
     *
     * @param templateIdList 模板id
     * @param tokenUser      当前用户
     * @return 额外字段
     */
    List<CompanyAdditionalFieldsDO> listByTemplateIdList(List<String> templateIdList, TokenUser tokenUser);

    /**
     * 根据来源id和字段名查询额外字段
     *
     * @param sourceId  来源id
     * @param fieldName 字段名称
     * @param tokenUser 当前用户
     * @return 额外字段
     */
    CompanyAdditionalFieldsDO listBySourceId(Long sourceId, String fieldName, TokenUser tokenUser);

    /**
     * 删除自定义模板自定义字段
     *
     * @param tokenUser                 当前用户
     * @param companyAdditionalFieldsId 主键id
     * @return 删除数量
     */
    int deleteForCustom(TokenUser tokenUser, Long companyAdditionalFieldsId);

}


